home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1996
/
MacHack 1996.toast
/
Presentations
/
Presentations ’91
/
DAL Files
/
DALtool 4⁄19 (System 6.x)
/
DalDalInterface.c
< prev
next >
Wrap
Text File
|
1991-06-19
|
7KB
|
336 lines
/* DAL handling routines */
#include <string.h>
#include "cl1api.h"
#include "cl1err.h"
#include "DalDemo.h"
extern Rect gOutRect;
extern CharsHandle gInText;
long sessionId;
long gTimer;
long gCounter;
int gDALState;
Boolean gDALActive, gDALMonitor, gDALNewCodeFrag;
/***These first few routines provide basic utilities without relying upon
outside libraries--trying to keep the executable small***/
/***StrLen***/
int StrLen(s)
char *s;
{
int n;
for (n = 0; *s != '\0'; s++) n++;
return n;
}
/***StrToOut***/
void StrToOut(demoWind,str)
demoPeek demoWind;
char *str;
{
long len;
if ((len = (long) StrLen(str)) != 0)
{
TESetSelect(32767,32767,demoWind->outputTE);
TEInsert(str,len,demoWind->outputTE);
}
}
/***IntToOut***/
void IntToOut(demoWind,num)
demoPeek demoWind;
int num;
{
int i,j,c,sign;
char str[24];
if ((sign = num) < 0)
num = -num;
i = 0;
do {
str[i++] = num % 10 + '0';
} while ((num /= 10) > 0);
if (sign < 0)
str[i++] = '-';
str[i] = '\0';
for (i = 0, j = StrLen(str); i < j; i++, j--)
c = str[i], str[i] = str[j-1], str[j-1] = c;
StrToOut(demoWind,str);
}
/***NLToOut***/
void NLToOut(demoWind)
demoPeek demoWind;
{
TEKey(TE_CARRIAGE_RETURN,demoWind->outputTE);
}
/***Provide a static method for displaying 'english' meaning to numeric err
messages**/
void DALTransErr(demoWind,err)
demoPeek demoWind;
int err;
{
switch (err)
{
case A_OK: StrToOut(demoWind,"OK/VAL ");
break;
case A_NULL: StrToOut(demoWind,"NULL ");
break;
case A_ERROR: StrToOut(demoWind,"ERROR ");
break;
case A_READY: StrToOut(demoWind,"READY ");
break;
case A_BADTYPE: StrToOut(demoWind,"BADTYPE ");
break;
case A_BREAK: StrToOut(demoWind,"BREAK ");
break;
case A_EXEC: StrToOut(demoWind,"EXEC ");
break;
case A_NOTCONN: StrToOut(demoWind,"NOTCONN ");
break;
case A_SESSMAX: StrToOut(demoWind,"SESSMAX ");
break;
case A_INUSE: StrToOut(demoWind,"INUSE ");
break;
case A_NOHOST: StrToOut(demoWind,"NOHOST ");
break;
default:
StrToOut(demoWind,"unknown error ");
}
}
/***Create the session link***/
void DALOpenLink(demoWind,node,user,pass)
demoPeek demoWind;
char *node, *user, *pass;
{
int err;
PtoCstr(node);
PtoCstr(user);
PtoCstr(pass);
sessionId = -1L;
err = CLInit(&sessionId,node,user,pass,"\0");
if (err != A_OK)
DALErrorHandler(demoWind,err);
else
{
gDALActive = TRUE;
StrToOut(demoWind,"OpenLink:Connection established");
NLToOut(demoWind);
}
}
/***DALSendExecute will send the fragment found in the input buffer
and instruct the server to execute it if no errors occur during transmission***/
void DALSendExecute(demoWind)
demoPeek demoWind;
{
int len;
int err;
TEPtr te;
te = *(demoWind->curTE);
if ((len = te->teLength) == 0) return;
SwitchToNewArea(demoWind);
NLToOut(demoWind);
StrToOut(demoWind,"<Sending and Executing>");
NLToOut(demoWind);
TEPaste(demoWind->curTE);
NLToOut(demoWind);
AdjustScrollBar(demoWind);
SwitchToNewArea(demoWind);
gDALNewCodeFrag = TRUE;
HLock(gInText);
err = CLSend(sessionId,*gInText,len);
HUnlock(gInText);
if (err != A_OK)
DALErrorHandler(demoWind,err);
else
{
err = CLExec(sessionId);
if (err != A_OK)
DALErrorHandler(demoWind,err);
}
}
/***DALMonitorState is used to find the server state on a periodic basis***/
void DALMonitorState(demoWind)
demoPeek demoWind;
{
int err;
long ticks;
if ((ticks = TickCount()) >= gTimer)
{
gTimer += DAL_MONITOR_INTERVAL;
++gCounter;
err = CLState(sessionId);
if (err == A_ERROR && gDALNewCodeFrag)
DALErrorHandler(demoWind,err);
if (gDALMonitor) DALDisplayState(demoWind);
if (gDALState == A_VALUE && gDALNewCodeFrag) DALReadLink(demoWind);
}
}
/***DALErrorHandler gets additional error status messages from server***/
void DALErrorHandler(demoWind,err)
demoPeek demoWind;
int err;
{
long errp;
long err2p;
char itm1[80];
char itm2[80];
char msg[80];
gDALState = CLGetErr(sessionId, &errp, &err2p, itm1, itm2, msg);
NLToOut(demoWind);
DALTransErr(demoWind,err);
StrToOut(demoWind,msg);
NLToOut(demoWind);
gDALNewCodeFrag = FALSE;
}
/***DALDisplayState***/
void DALDisplayState(demoWind)
demoPeek demoWind;
{
DALTransErr(demoWind,gDALState);
}
/***DALCloseSession does a clean shutdown***/
void DALCloseLink(demoWind)
demoPeek demoWind;
{
int err;
err = CLEnd(sessionId);
if (err != A_OK)
DALErrorHandler(demoWind,err);
else
gDALActive = FALSE;
}
/***DALReadLink gets data from the server when ready***/
void DALReadLink(demoWind)
demoPeek demoWind;
{
short typep;
short lenp;
short placep;
short flagsp;
Ptr buffer[DAL_MAXCOL];
int err;
short maxCol;
short bIndex;
Boolean firstRow;
/* do informational wait loop checking for data */
firstRow = TRUE;
bIndex = 0;
maxCol = 0;
buffer[bIndex] = (Ptr) NIL;
typep = A_ANYTYPE;
err = CLGetItem(sessionId, DAL_MONITOR_INTERVAL/4, &typep, &lenp, &placep, &flagsp,
NIL);
if (err < A_VALUE) return;
StrToOut(demoWind,"<Reading Program Output>");
NLToOut(demoWind);
while (err != A_ERROR && err != A_READY)
{
typep = A_ANYTYPE;
err = CLGetItem(sessionId, AW_FOREVER, &typep, &lenp, &placep, &flagsp,
NIL);
if (err != A_VALUE) break;
/* if this is the first row, set up buffer space for each column's data */
if (firstRow)
{
switch (typep)
{
case A_BOOLEAN:
case A_SMINT:
case A_INTEGER:
case A_SMFLOAT:
case A_DATE:
case A_TIME:
case A_TIMESTAMP:
lenp = 8;
break;
case A_VCHAR:
case A_CHAR:
lenp += 1; /* add one for null character termination */
break;
default:
break;
}
if ((buffer[bIndex] = NewPtr(lenp)) == NIL) ErrorHandler(NO_MEMORY);
/* check to see if this is the last colitem in this row...
last time to grab pointers for this data request */
firstRow = !(flagsp & AF_RECEND);
}
else
{
switch (typep)
{
case A_VCHAR:
case A_CHAR:
DisposPtr(buffer[bIndex]);
lenp += 1; /* add one for null character termination */
if ((buffer[bIndex] = NewPtr(lenp)) == NIL) ErrorHandler(NO_MEMORY);
break;
default:
break;
}
} /*else*/
if (bIndex > maxCol) maxCol = bIndex;
err = CLGetItem(sessionId, AW_FOREVER, &typep, &lenp, &placep, &flagsp,
buffer[bIndex]);
if (err != A_VALUE && err != A_NULL) break;
if (flagsp & AF_RECEND)
{
DALDisplayRow(demoWind,buffer,bIndex);
bIndex = 0;
}
else
++bIndex;
} /*while*/
/* free up memory */
bIndex = 0;
while (maxCol-- >= 0)
DisposPtr(buffer[bIndex++]);
NLToOut(demoWind);
} /*DALReadLink*/
/***DALDisplayRow***/
void DALDisplayRow(demoWind,buffer,bufLen)
demoPeek demoWind;
Ptr *buffer;
int bufLen;
{
int i;
for (i = 0; i <= bufLen; i++)
{
StrToOut(demoWind,(char *) buffer[i]);
StrToOut(demoWind," ");
}
NLToOut(demoWind);
}